package com.sumainfor.pc.gmio.service.impl;
import com.sumainfor.common.Constants;
import com.sumainfor.common.util.ContextUtils;
import com.sumainfor.common.util.JsonResult;
import com.sumainfor.common.utlis.ComUtils;
import com.sumainfor.common.utlis.ParamsCommon;
import com.sumainfor.pc.gmio.dao.HoRechargeMapper;
import com.sumainfor.pc.gmio.dao.SeBillPayMapper;
import com.sumainfor.pc.gmio.dao.SeTenantBillMapper;
import com.sumainfor.pc.gmio.dao.UtilsMapper;
import com.sumainfor.pc.gmio.feign.Zfeign.ZwxTenantFeign;
import com.sumainfor.pc.gmio.service.HoRechargeService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;

/**
 * pc端调用微信租客端
 */
@Service
public class HoRechargeServiceimpl implements HoRechargeService {

    private ReentrantLock lock = new ReentrantLock(false);
    Logger log = LoggerFactory.getLogger(HoRechargeServiceimpl.class);

    @Autowired
    private HoRechargeMapper hoRechargeMapper;
    @Autowired
    private UtilsMapper utilsMapper;
    @Autowired
    private ZwxTenantFeign zwxTenantFeign;
    @Autowired
    private SeBillPayMapper seBillPayMapper;
    @Autowired
    private SeTenantBillMapper seTenantBillMapper;
    /**
     * 智能设备充值记录
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public JsonResult addHoRecharge(Map<String, Object> params) {
        JsonResult result=new JsonResult();
        /**
         * 加锁操作
         */
        lock.lock();
        try{
            try {
                if (params.get("CorId")==null || params.get("TenId")==null || params.get("HouId")==null
                        || params.get("HouInfoId")==null || params.get("Intelligent")==null ||params.get("IntelligentId")==null
                        || params.get("EleFee")==null  || params.get("Certificate")==null
                        || params.get("IfCoucode")==null || params.get("RechargePrice")==null || params.get("PaId")==null){
                    return result.putFailed("参数不正确");
                }
                System.out.println("params:"+params);
                //如果使用了优惠卷就判断相关的参数是否为空  IfCoucode0未使用优惠卷 1使用了优惠卷
                if (params.get("IfCoucode").toString().equals("1")){
                    if (params.get("Coucode")==null || params.get("Facevalue")==null){
                        return result.putFailed("参数不正确");
                    }else{
                        params.put("Couponcd",params.get("Coucode"));//优惠卷编号
                        params.put("Couponamt",params.get("Facevalue"));//优惠卷金额
                    }
//                    else {
//                        //如果使用了优惠卷并且优惠卷相关的参数不为空的时候修改优惠卷已使用
//                        JsonResult zwxTentResult=zwxTenantFeign.updateHotc(params);
//                        if(zwxTentResult.get("errorCode").toString().equals("0")){
//                            Map<String,Object> zwxTent=(Map<String,Object>)zwxTentResult.get("result");
//                            //优惠卷是否修改成功 0未修改成功 1修改成功
//                            Integer wxtenCount=Integer.parseInt(zwxTent.get("result").toString());
//                            if (wxtenCount<=0){
//                                return  result.putFailed("服务器繁忙");
//                            }
//                        }else{
//                            return result.putFailed("服务器繁忙");
//                        }
//                    }
                }
                //需要计算本次充值的金额可以换算成多少可用电量(充值金额/电费收费标准)
                BigDecimal electricity=new BigDecimal(params.get("RechargePrice").toString()).divide(new BigDecimal(params.get("EleFee").toString()),2);
                String RECHARGEID="";//充值记录编号
                Map<String, Object> uuid = utilsMapper.getUUID(new HashMap<String, Object>() {{
                    put("uuid", "ReChargeId");
                    put("database", Constants.DATA_SOURCE_GMIO);
                    put("surface", "tcgmio_recharge");
                }});
                if (uuid != null && (!uuid.get("uuid").toString().equals(""))) {
                    int number = Integer.valueOf(uuid.get("uuid").toString());
                    RECHARGEID = ComUtils.getLocalTrmSeqNum("re", number);
                } else {
                    RECHARGEID = ComUtils.getLocalTrmSeqNum("re", 0);
                }
                params.put("Electricity",electricity);//本次充值电量
                params.put("ReChargeId",RECHARGEID);//充值记录编号
                params.put("Certificate",params.get("Certificate"));//支付凭证
                params.put("by", "auto");//操作人
                params.put("term", "2");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                params.put("fnc",
                        this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                ParamsCommon.commonInsertParms(params);
                params.put("RechargeTime",params.get("instm"));//充值时间
                Integer count1=hoRechargeMapper.addHoRecharge(params);

                //获取支付账单编号
                String PAYID="";//收入账单编号
                Map<String, Object> uuid2 = utilsMapper.getUUID(new HashMap<String, Object>() {{
                    put("uuid", "PayId");
                    put("database", Constants.DATA_SOURCE_GMIO);
                    put("surface", "tcgmio_bill_pay");
                }});
                if (uuid2 != null && (!uuid2.get("uuid").toString().equals(""))) {
                    int number = Integer.valueOf(uuid2.get("uuid").toString());
                    PAYID = ComUtils.getLocalTrmSeqNum("pa", number);
                } else {
                    PAYID = ComUtils.getLocalTrmSeqNum("pa", 0);
                }
                //组装支出支付信息参数
                params.put("PayId",PAYID);//支付订单编号
                params.put("Shape",1);//支付形式   0.线上   1.线下
                params.put("PayTime", params.get("instm"));//支付时间
                params.put("PayMoney",params.get("RechargePrice"));//支付金额
                params.put("PayFile",params.get("Certificate"));//支付凭证
                params.put("PatStatus",1);//支付订单审核状态   0订单无需审核（线上）   1.待审核  2.审核驳回  3.审核通过
                params.put("PatStats",2);//支付状态    1.未支付  2.支付成功
                Integer count2=seBillPayMapper.addSeBillPay(params);

                //获取账单编号
                String BIID="";//收入账单编号
                Map<String, Object> uuid3 = utilsMapper.getUUID(new HashMap<String, Object>() {{
                    put("uuid", "BiId");
                    put("database", Constants.DATA_SOURCE_GMIO);
                    put("surface", "tcgmio_tenant_bill");
                }});
                if (uuid3 != null && (!uuid3.get("uuid").toString().equals(""))) {
                    int number = Integer.valueOf(uuid3.get("uuid").toString());
                    BIID = ComUtils.getLocalTrmSeqNum("bi", number);
                } else {
                    BIID = ComUtils.getLocalTrmSeqNum("bi", 0);
                }
                //组装账单参数
                params.put("BiId",BIID);//账单编号
                params.put("MainBody", "0");//账单主体类型   0.普通账单    1.企业账单
                params.put("BiName","智能电表充值账单");//首月账单生成时间
                params.put("IfTemporary","0");//是否是临时账单    0.否   1.是
                params.put("BiType","8");//首月账单生成时间账单类型  1.房租（合同） 2.公共事业费  3.维修费用
                //4.延期退  5.其他费用  6.退租账单 7.夜间开门   8.智能电表
                params.put("Source",RECHARGEID);//首月账单生成时间
                params.put("BiMoney",params.get("RechargePrice"));//账单金额
                params.put("BillExplain","智能电表充值"+params.get("RechargePrice")+"元");
                params.put("IfTemporary", "1");//是否是临时账单    0.否   1.是\n没有关联来源',
                params.put("IfAdjust", "0");//当前账单是否可以调整   0.否  1.是\n水电燃房租不可调整  类型 1-2
                params.put("TenId", params.get("TenId"));//租客编号
                params.put("HouId", params.get("HouId"));//房源主表编号
                params.put("HouInfoId", params.get("HouInfoId"));//房源详表编号
                params.put("CreateType", "1");//账单创建人类型  1.系统  2.人为
                params.put("Create", "auto");//账单创建人
                params.put("ExpStatus", "0");//账单逾期状态 0未逾期， 1逾期 超过最晚状态还未支付
                // map.put("ExpTime",0);//账单逾期开始时间
                params.put("Status", "3");//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）

                params.put("BiGenerated",params.get("instm"));//账单生成日
                params.put("EndTime",params.get("instm") );//账单结束时间
                params.put("LateDay", params.get("instm"));//账单最晚付款日
                Integer count3=seTenantBillMapper.addTenantBill(params);
                if (count1>0 && count2>0 && count3>0){
                    result.put("操作成功");
                }else{
                    result.putFailed("服务器繁忙");
                }
            } catch (Exception e) {
                e.printStackTrace();
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            }
        }
        finally {
            lock.unlock();
        }
        return result;
    }
    /**
     * 查询智能电表充值记录
     */
    public JsonResult getHoReChargeIdList(Map<String,Object> params){
        JsonResult result=new JsonResult();
        if (params.get("ReChargeId")==null){
            return result.putFailed("参数不正确");
        }
        Map<String,Object> list=hoRechargeMapper.getHoReChargeIdList(params);
        if (list!=null){
            result.put(list);
        }else{
            result.putFailed("服务器繁忙");
        }
        return result;
    }

    /**
     * 功能描述:
     * 根据智能电表充值记录编号获取充值记录资料
     * @Author zhlu
     * @Description //TODO
     * @Date 2019/7/16 14:54
     */
    @Override
    public Map<String, Object> getReChargeIdByMap(String ReChargeId) {
        if(!StringUtils.isNotEmpty(ReChargeId)){
            return new HashMap<>();
        }
        return hoRechargeMapper.getReChargeIdByMap(ReChargeId);
    }

    public static void main(String[] args) {
        BigDecimal a=new BigDecimal("200");
        BigDecimal b=new BigDecimal("0.98");
        System.out.println(a.divide(b,0));
    }
}
